package com.teacher.game.model;

import android.graphics.Rect;
import com.teacher.game.framework.util.Painter;

/**
 * 抽象障碍物基类 - 所有障碍物的基础接口
 * 支持不同类型障碍物的扩展和多态
 */
public abstract class AbstractObstacle {
    
    protected float x, y;           // 位置
    protected int width, height;    // 尺寸
    protected boolean isPassed = false;     // 是否已被越过
    protected boolean isActive = true;      // 是否激活
    
    // 障碍物类型枚举
    public enum ObstacleType {
        STATIC,         // 静态障碍物
        MOVING,         // 移动障碍物  
        COMBO,          // 组合障碍物
        DESTRUCTIBLE,   // 可破坏障碍物
        BOSS            // Boss障碍物
    }
    
    protected ObstacleType type;
    
    /**
     * 构造函数
     */
    public AbstractObstacle(float x, float y, int width, int height, ObstacleType type) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.type = type;
    }
    
    /**
     * 更新障碍物状态（抽象方法 - 子类实现）
     */
    public abstract void update(float delta, int baseSpeed);
    
    /**
     * 渲染障碍物（抽象方法 - 子类实现）
     */
    public abstract void render(Painter g);
    
    /**
     * 重置障碍物状态（抽象方法 - 子类实现）
     */
    public abstract void reset(float newX, float newY);
    
    /**
     * 获取碰撞矩形
     */
    public abstract Rect getCollisionRect();
    
    /**
     * 检查是否需要特定操作通过障碍物
     */
    public abstract boolean requiresJump();
    public abstract boolean requiresDuck();
    
    // === 通用方法 ===
    
    /**
     * 检查是否在屏幕内
     */
    public boolean isOnScreen(int screenWidth) {
        return x > -width && x < screenWidth;
    }
    
    /**
     * 检查是否已离开屏幕
     */
    public boolean isOffScreen() {
        return x < -width;
    }
    
    // === Getter和Setter ===
    
    public float getX() { return x; }
    public float getY() { return y; }
    public int getWidth() { return width; }
    public int getHeight() { return height; }
    
    public boolean isPassed() { return isPassed; }
    public void setPassed(boolean passed) { this.isPassed = passed; }
    
    public boolean isActive() { return isActive; }
    public void setActive(boolean active) { this.isActive = active; }
    
    public ObstacleType getType() { return type; }
    
    public float getCenterX() { return x + width / 2f; }
    public float getCenterY() { return y + height / 2f; }
    public float getRightEdge() { return x + width; }
    public float getBottomEdge() { return y + height; }
    
    /**
     * 设置位置
     */
    public void setPosition(float x, float y) {
        this.x = x;
        this.y = y;
    }
    
    /**
     * 获取障碍物难度分数（用于难度平衡）
     */
    public abstract int getDifficultyScore();
    
    /**
     * 获取障碍物奖励分数
     */
    public abstract int getRewardScore();
}